# -*- coding: utf-8 -*-
import os
import time
import zipfile

import chardet
import numpy as np
import os
import pandas as pd
import rarfile
from datetime import datetime


#path-文件夹所在路径
def traversedir(path):
    all_files = os.listdir(path)  #返回指定路径下的文件和文件夹列表。
    all_files = [os.path.join(path, _path) for _path in all_files]  #指定路径下所有文件(夹)列表


def list_directories(directory):
    """
    列出指定目录下的所有文件夹(仅包含文件夹名)。

    参数:
    directory -- 要搜索的目录路径

    返回:
    文件夹名称列表
    """
    # 获取指定目录下的所有文件和文件夹
    items = os.listdir(directory)

    # 筛选出文件夹
    directories = [item for item in items if os.path.isdir(os.path.join(directory, item))]

    return directories


def list_directories_with_absolute_paths(directory):
    """
    列出指定目录下所有子目录的绝对路径。

    参数:
    directory -- 要搜索的目录路径

    返回:
    子目录的绝对路径列表
    """
    # 获取指定目录下的所有文件和文件夹
    items = os.listdir(directory)

    # 筛选出文件夹，并获取它们的绝对路径
    directories = [os.path.join(directory, item) for item in items if os.path.isdir(os.path.join(directory, item))]

    return directories


#读文件为二维数组，每行在1维
# _path-文件所在路径
#分隔符
def read_file(_path, delim='/t'):
    data = []
    if delim == 'tab':
        delim = '/t'
    elif delim == 'space':
        delim = ' '
    with open(_path, 'r') as f:
        for line in f:
            line = line.strip().split(delim)
            line = [float(i) for i in line]
            data.append(line)
    return np.asarray(data)


def file_test():
    currentpath = os.path.dirname(os.path.dirname(__file__))
    parent_path = os.path.dirname(os.path.join(currentpath, os.pardir))  #父目录-去上一级路径
    print(parent_path)
    print(__file__)  # 获取当前文件的相对路径-带文件名
    print(os.path.dirname(__file__))  # 获取当前文件所在目录的相对路径
    print(os.path.abspath(__file__))  # 获取当前文件的绝对路径-带文件名
    print(os.path.dirname(os.path.abspath(__file__)))  # 获取当前文件的所在目录的绝对路径
    cur_dir = '/'.join(os.path.abspath(__file__).split('/')[:-1])
    print("当前绝对路径（不带文件名）：", cur_dir)
    path = os.getcwd()  #绝对路径-当前文件所在工作目录
    print(path)

def list_files_to_excel(directory, excel_file=None):
    """
    功能(好用)：用python遍历指定文件夹()，将文件清单写入excel中;
    特点：文件会生成在directory目录下；
    # 指定要遍历的目录和输出的Excel文件名
    directory_path = 'D:/天星科技发展有限公司/项目相关文档/上传文档-贵安/贵安项目-源码202410/算力调度平台'
    list_files_to_excel(directory_path)

    """
    # 创建一个空列表来存储文件信息
    files_list = []

    # 遍历指定目录及其子目录
    for root, dirs, files in os.walk(directory):
        # 跳过回收站目录
        if '$Recycle.bin' in dirs:
            dirs.remove('$Recycle.bin')
        for file in files:
            # 构建文件的完整路径
            full_path = os.path.join(root, file)
            # 获取文件的相对路径
            rel_path = os.path.relpath(full_path, directory)
            # full_path = os.path.normpath(full_path)
            # 获取文件的大小
            # file_size = os.path.getsize(full_path)
            # 获取文件的最后修改时间
            # last_modified_time = os.path.getmtime(full_path)

            # 将文件信息添加到列表中
            files_list.append({
                'Relative Path': rel_path,
                'File Name': file,
                # 'Size (Bytes)': file_size,
                # 'Last Modified Time': last_modified_time
            })

    # 创建一个DataFrame
    df = pd.DataFrame(files_list)

    # 如果没有指定excel_file，则使用目录名作为Excel文件名
    if excel_file is None:
        directory_name = os.path.basename(directory)
        excel_file = os.path.splitext(directory_name)[0] + '.xlsx'
        excel_file = os.path.join(directory, excel_file)  # 确保路径正确

    # 将DataFrame写入Excel文件
    df.to_excel(excel_file, index=False)

    print(f"Files have been written to {excel_file}")

def list_files_to_excel2(directory, excel_file):
    """
    功能：用python遍历指定文件夹()，将文件清单写入excel中;
    # 指定要遍历的目录和输出的Excel文件名
    directory = 'dict_rel'
    excel_file = 'file_list.xlsx'
    # 调用函数
    list_files_to_excel(directory, excel_file)

    """
    # 创建一个空列表来存储文件信息
    files_list = []

    # 遍历指定目录及其子目录
    for root, dirs, files in os.walk(directory):
        for file in files:
            # 构建文件的完整路径
            full_path = os.path.join(root, file)
            # 获取文件的相对路径
            rel_path = os.path.relpath(full_path, directory)
            # 获取文件的大小
            file_size = os.path.getsize(full_path)
            # 获取文件的最后修改时间
            # last_modified_time = os.path.getmtime(full_path)

            # 将文件信息添加到列表中
            files_list.append({
                'Relative Path': rel_path,
                'File Name': file,
                'Size (Bytes)': file_size,
                # 'Last Modified Time': last_modified_time
            })

    # 创建一个DataFrame
    df = pd.DataFrame(files_list)

    # 将DataFrame写入Excel文件
    df.to_excel(excel_file, index=False)


"""功能：取压缩文件列表-》.xlsx；
调用：
    # 指定ZIP文件和输出的Excel文件名
    zip_file = 'D:/ProjectWorkspace/pytorchgpuProjects/file_dir_convert_process/docxlspdf_deal.zip'
    excel_file = 'zip_file_list.xlsx'
    # 调用函数
    list_zip_files_to_excel(zip_file, excel_file)
"""


def convert_to_utf8(byte_str):
    """
    尝试将字节串转换为UTF-8编码的字符串。

    参数:
    byte_str -- 可能是乱码的字节串

    返回:
    UTF-8编码的字符串，如果无法识别编码则返回None
    """
    # 使用chardet检测字节串的编码
    detected = chardet.detect(byte_str)

    # 打印检测到的编码
    print(f"Detected encoding: {detected['encoding']}")

    # 如果检测到的编码不是utf-8，则使用检测到的编码解码字节串
    if detected['encoding'].lower() != 'utf-8':
        try:
            # 使用检测到的编码将字节串解码回字符串
            original_str = byte_str.decode(detected['encoding'])
            return original_str
        except UnicodeDecodeError:
            # 如果解码失败，返回None
            print("Failed to decode the byte string using detected encoding.")
            return None
    else:
        # 如果已经是utf-8，直接返回解码后的字符串
        return byte_str.decode('utf-8')

def list_zip_files_to_excel(zip_file, excel_file):
    """问题：zip文件的有乱码问题；"""
    # 打开ZIP文件
    with zipfile.ZipFile(zip_file, 'r') as z:
        # 创建一个空列表来存储文件信息
        zip_files_list = []

        # 遍历ZIP文件中的所有文件
        for file_info in z.infolist():
            # 获取文件的文件名
            file_name = file_info.filename
            rel_path = convert_to_utf8(file_name)
            # 获取文件的相对路径（在ZIP文件中的路径）
            # rel_path = file_name
            # rel_path = rel_path.encode("utf-8").decode("gbk")
            # 获取文件的大小
            file_size = file_info.file_size
            # 获取文件的最后修改时间，并格式化为年月日时分秒
            # # zipfile的date_time是一个包含年、月、日、时、分、秒的元组
            # dt = datetime(*(time.gmtime(file_info.date_time + time.timezone)[:6]))
            # last_modified_time = dt.strftime('%Y-%m-%d %H:%M:%S')

            # 将文件信息添加到列表中
            zip_files_list.append({
                'Relative Path': rel_path,
                'File Name': file_name.split('/')[-1],  # 只获取文件名
                'Size (Bytes)': file_size,
                # 'Last Modified Time': last_modified_time
            })
            print(f"Relative:{rel_path}")

    # 创建一个DataFrame
    df = pd.DataFrame(zip_files_list)

    # 将DataFrame写入Excel文件
    df.to_excel(excel_file, index=False)
    print(f"{excel_file} Done~/n")


def find_zip_files(directory, extension='.zip'):
    """
    问题：直接查看file_info.filename会有中文乱码问题；
    遍历指定目录及其子目录，寻找所有匹配指定扩展名的压缩文件。

    :param directory: 要遍历的目录路径
    :param extension: 要查找的文件扩展名，默认为 '.zip'
    :return: 包含找到的压缩文件绝对路径的列表
    调用：
        directory = "D:/天星科技发展有限公司/项目相关文档/上传文档-贵安/贵安项目-源码202410"
        zip_files_list = find_zip_files(directory)

        # 打印找到的.zip文件路径
        for zip_file_path in zip_files_list:
            print(zip_file_path)
    """
    zip_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                zip_files.append(os.path.join(root, file))
    return zip_files


def find_compressed_files(directory, extensions=['.zip', '.rar']):
    """
    问题：直接查看file_info.filename会有中文乱码问题；
    遍历指定目录及其子目录，寻找所有匹配指定扩展名列表的压缩文件。

    :param directory: 要遍历的目录路径
    :param extensions: 要查找的文件扩展名列表，默认为 ['.zip', '.rar']
    :return: 包含找到的压缩文件绝对路径的列表
    调用：
    directory = "D:/天星科技发展有限公司/项目相关文档/上传文档-贵安/贵安项目-源码202410"
    # 调用函数，找到所有.zip和.rar文件
    compressed_files_list = find_compressed_files(directory)

    # 打印找到的压缩文件路径
    for compressed_file_path in compressed_files_list:
        print(compressed_file_path)
    """
    compressed_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if any(file.endswith(ext) for ext in extensions):
                compressed_files.append(os.path.join(root, file))
    return compressed_files


def list_compressed_files_to_excel2(compressed_file, excel_file):
    """
    功能：取压缩文件列表(.zip或.rar)-》.xlsx；
    调用：
    zip_file = 'D:/天星科技发展有限公司/项目相关文档/上传文档-贵安/贵安项目-源码202410/AI数字人.zip'
    excel_file = 'AI数字人-源代码清单.xlsx'
    # 调用函数
    list_compressed_files_to_excel(zip_file, excel_file)
    """
    # 创建一个空列表来存储文件信息
    compressed_files_list = []

    # 检查文件类型并相应地打开
    if compressed_file.endswith('.zip'):
        with zipfile.ZipFile(compressed_file, 'r', encoding='utf-8') as z:
            # 遍历ZIP文件中的所有文件
            for file_info in z.infolist():
                # 获取文件的文件名
                file_name = file_info.filename
                # 获取文件的相对路径（在压缩文件中的路径）
                rel_path = file_name
                # 获取文件的大小
                file_size = file_info.file_size
                # 获取文件的最后修改时间，并格式化为年月日时分秒
                # dt = datetime(*(time.gmtime(file_info.date_time + time.timezone)[:6]))
                # last_modified_time = dt.strftime('%Y-%m-%d %H:%M:%S')

                # 将文件信息添加到列表中
                compressed_files_list.append({
                    'Relative Path': rel_path,
                    'File Name': file_name.split('/')[-1],  # 只获取文件名
                    'Size (Bytes)': file_size,
                    # 'Last Modified Time': last_modified_time
                })
    elif compressed_file.endswith('.rar'):
        with rarfile.RarFile(compressed_file, 'r') as r:
            # 遍历RAR文件中的所有文件
            for file_info in r.infolist():
                # 获取文件的文件名
                file_name = file_info.filename
                # 获取文件的相对路径（在压缩文件中的路径）
                rel_path = file_name
                # 获取文件的大小
                file_size = file_info.file_size
                # 获取文件的最后修改时间，并格式化为年月日时分秒
                # last_modified_time = datetime.fromtimestamp(file_info.date_time).strftime('%Y-%m-%d %H:%M:%S')

                # 将文件信息添加到列表中
                compressed_files_list.append({
                    'Relative Path': rel_path,
                    'File Name': file_name.split('/')[-1],  # 只获取文件名
                    'Size (Bytes)': file_size,
                    # 'Last Modified Time': last_modified_time
                })

    # 创建一个DataFrame
    df = pd.DataFrame(compressed_files_list)

    # 将DataFrame写入Excel文件
    df.to_excel(excel_file, index=False)
    print(f"{excel_file} Done~")


def list_compressed_files_to_excel(compressed_file):
    """
    问题：直接查看file_info.filename会有中文乱码问题；
    功能：取压缩文件列表(.zip或.rar)-》.xlsx；
    # 调用函数
        zip_file = 'D:/天星科技发展有限公司/项目相关文档/上传文档-贵安/贵安项目-源码202410/AI数字人.zip'
        list_compressed_files_to_excel(zip_file)
    """
    # 创建一个空列表来存储文件信息
    compressed_files_list = []

    # 检查文件类型并相应地打开
    if compressed_file.endswith('.zip'):
        with zipfile.ZipFile(compressed_file, 'r') as z:
            # 遍历ZIP文件中的所有文件
            for file_info in z.infolist():
                # 获取文件的文件名
                file_name = file_info.filename
                # 获取文件的相对路径（在压缩文件中的路径）
                rel_path = file_name
                # 获取文件的大小
                file_size = file_info.file_size
                # 获取文件的最后修改时间，并格式化为年月日时分秒
                # dt = datetime(*(time.gmtime(file_info.date_time)[:6]))
                # last_modified_time = dt.strftime('%Y-%m-%d %H:%M:%S')

                # 将文件信息添加到列表中
                compressed_files_list.append({
                    'Relative Path': rel_path,
                    'File Name': file_name.split('/')[-1],  # 只获取文件名
                    'Size (Bytes)': file_size,
                    # 'Last Modified Time': last_modified_time
                })
    elif compressed_file.endswith('.rar'):
        with rarfile.RarFile(compressed_file, 'r') as r:
            # 遍历RAR文件中的所有文件
            for file_info in r.infolist():
                # 获取文件的文件名
                file_name = file_info.filename
                # 获取文件的相对路径（在压缩文件中的路径）
                rel_path = file_name
                # 获取文件的大小
                file_size = file_info.file_size
                # 获取文件的最后修改时间，并格式化为年月日时分秒
                # last_modified_time = datetime.fromtimestamp(file_info.date_time).strftime('%Y-%m-%d %H:%M:%S')

                # 将文件信息添加到列表中
                compressed_files_list.append({
                    'Relative Path': rel_path,
                    'File Name': file_name.split('/')[-1],  # 只获取文件名
                    'Size (Bytes)': file_size,
                    # 'Last Modified Time': last_modified_time
                })

    # 创建Excel文件名，根据compressed_file的文件名，替换后缀名为.xlsx
    excel_file_name = os.path.splitext(compressed_file)[0] + '.xlsx'
    # 创建一个DataFrame
    df = pd.DataFrame(compressed_files_list)

    # 确保中文不乱码
    with pd.ExcelWriter(excel_file_name, engine='openpyxl') as writer:
        df.to_excel(writer, index=False, sheet_name='Sheet1')

    print(f"{excel_file_name} Done~")
    # # 将DataFrame写入Excel文件
    # # df.to_excel(excel_file_name, index=False)
    # df.to_excel(excel_file_name, index=False, engine='openpyxl')#支持中文
    # print(f"{excel_file_name} Done~")


def process_compressed_files_in_directory(directory):
    """
    问题：直接查看file_info.filename会有中文乱码问题；
    处理指定目录下的所有压缩文件(.zip,.rar)，将每个压缩文件的文件清单写入Excel文件。

    :param directory: 要处理的目录路径
    调用：
    directory = "D:/天星科技发展有限公司/项目相关文档/上传文档-贵安/贵安项目-源码202410"
    process_compressed_files_in_directory(directory)
    """
    # 调用函数，找到所有.zip和.rar文件
    compressed_files_list = find_compressed_files(directory)

    # 遍历找到的压缩文件，并处理它们
    for compressed_file_path in compressed_files_list:
        print(compressed_file_path)
        list_compressed_files_to_excel(compressed_file_path)


def rename_files_in_folder(folder_path, old_text, new_text):
    """
    在指定的文件夹中重命名包含特定文本的文件。

    参数:
    folder_path (str): 文件夹的路径。
    old_text (str): 需要被替换的文本。
    new_text (str): 替换后的文本。
    """
    # 遍历文件夹中的所有文件和子文件夹
    for filename in os.listdir(folder_path):
        # 检查文件名是否包含指定的旧文本
        if old_text in filename:
            # 构建新的文件名
            new_filename = filename.replace(old_text, new_text)
            # 获取文件的完整路径
            old_file = os.path.join(folder_path, filename)
            new_file = os.path.join(folder_path, new_filename)
            # 重命名文件
            os.rename(old_file, new_file)
            print(f'文件 {filename} 已重命名为 {new_filename}')

if __name__ == '__main__':
    pass
    # folders = list_directories_with_absolute_paths(directory_path)
    # for folder in folders:
    #     list_files_to_excel(folder)
    #     print(folder)

    # folder_path = 'D:/天星科技发展有限公司/项目相关文档/上传文档-贵安/按项目划分202411-贵安-捷通/在----捷通资料汇总----/调研方案'
    # rename_files_in_folder(folder_path, '需求调研分析报告', '调研方案')

    directory_path = 'D:/天星科技发展有限公司/项目相关文档/上传文档-电信/电信项目-源码/智算运维平台'
    list_files_to_excel(directory_path)